package cn.rkylin.oms.push.adapter;

import java.util.Map;

import cn.rkylin.oms.system.shop.domain.Shop;

public abstract class PushVisitor {
    /**
     * 构造函数
     */
    public PushVisitor() {

    }

    /**
     * 系统发货
     *
     * @param shop        网店对象
     * @param ecItemCode  平台商品编码
     * @param ecTradeCode 平台交易编码
     * @param ecSkuCode   平台规格编码
     * @return 结果对象
     */
    public abstract Map<String, Object> pushSystemConsignment(Shop shop, String ecItemCode, String ecTradeCode, String ecSkuCode,
                                                              String shipTime);

    /**
     * 自己联系物流（线下物流）发货
     *
     * @param shop        网店对象
     * @param ecTradeCode 平台交易编码
     * @param lgstNo      物流单号
     * @param lgstCode    物流公司编码
     * @return 结果对象
     */
    public abstract Map<String, Object> pushTradeOfflineSend(Shop shop, String ecTradeCode, String lgstNo, String lgstCode) throws Exception;

    /**
     * 商品上架
     *
     * @param shop       网店对象
     * @param ecItemCode 平台商品编码
     * @param stockCount 库存数量
     * @return 结果对象
     */
    public abstract Map<String, Object> pushItemListing(Shop shop, String ecItemCode, String stockCount) throws Exception;

    /**
     * 商品下架
     *
     * @param shop       网店对象
     * @param ecItemCode 平台商品编码
     * @return 结果对象
     */
    public abstract Map<String, Object> pushItemDeListing(Shop shop, String ecItemCode) throws Exception;

    /**
     * 批量同意退款
     *
     * @param shop          网店对象
     * @param ecRefundCodes 平台退款编号, 按照 ","号分割
     * @param code          短信验证码
     * @return 结果对象
     */
    public abstract Map<String, Object> pushRefundBatchAgree(Shop shop, String ecRefundCodes, String code);

    /**
     * 拒绝退款
     *
     * @param shop           网店对象
     * @param ecRefundCode   平台退款编号
     * @param refuseMessage  拒绝退款时的说明信息
     * @param refuseReasonId 拒绝原因编号
     * @param refusePath     拒绝退款时的退款凭证对应的本地绝对路径
     * @return 结果对象
     */
    public abstract Map<String, Object> pushRefundRefuse(Shop shop, String ecRefundCode, String refuseMessage, String refuseReasonId,
                                                         String refusePath);

    /**
     * 卖家同意退货
     *
     * @param shop            网店对象
     * @param ecRefundCode    平台退款编号
     * @param name            卖家姓名
     * @param address         卖家提供的退货地址
     * @param post            卖家提供的退货地址的邮编
     * @param tel             卖家座机
     * @param mobile          卖家手机
     * @param remark          卖家退货留言
     * @param sellerAddressId 卖家收货地址编号
     * @return 结果对象
     */
    public abstract Map<String, Object> pushReturnGoodsAgree(Shop shop, String ecRefundCode, String name, String address, String post,
                                                             String tel, String mobile, String remark, String sellerAddressId);

    /**
     * 审核退款单
     *
     * @param shop         网店对象
     * @param ecRefundCode 平台退款编号
     * @param erpStatus    审核状态 已审核/未审核
     * @return 结果对象
     */
    public abstract Map<String, Object> pushRefundAppr(Shop shop, String ecRefundCode, String erpStatus);

    /**
     * 宝贝/SKU库存修改(商品)
     *
     * @param shop       网店对象
     * @param ecItemCode 平台退款编号
     * @param skuId      规格id
     * @param stockCount 库存数量
     * @return 结果对象
     */
    public abstract Map<String, Object> pushItemQuantityUpdate(Shop shop, String ecItemCode, String skuId, String stockCount) throws Exception;

    /**
     * 宝贝/SKU库存修改(SKU)
     *
     * @param shop       网店对象
     * @param ecItemCode 平台退款编号
     * @param ecSkuCode  平台规格编码
     * @param stockCount 库存数量
     * @return 结果对象
     */
    public abstract Map<String, Object> pushSkuQuantityUpdate(Shop shop, String ecItemCode, String ecSkuCode, String stockCount) throws Exception;

    /**
     * 修改一笔交易备注
     *
     * @param tid  交易编号
     * @param memo 备注
     * @param flag 交易备注旗帜，可选值为：0(灰色), 1(红色), 2(黄色), 3(绿色), 4(蓝色), 5(粉红色)，默认值为0
     * @return
     * @throws Exception
     */
    public abstract Map<String, Object> pushTradeMemo(Shop shop, Long tid, String memo, Long flag) throws Exception;

    public void finalize() throws Throwable {

    }
}
